package com.dhcc.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.dhcc.api.R;
import com.dhcc.entity.SysDept;
import com.dhcc.entity.SysDeptPositionResource;
import com.dhcc.entity.SysResource;
import com.dhcc.service.SysDeptPositionResourceService;
import com.dhcc.service.SysResourceService;
import com.dhcc.support.Condition;
import com.dhcc.support.Query;
import com.dhcc.response.SysResourceListTree;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Map;

/**
 * 资源管理控制层接口
 *
 * @ProjectName Dhcc-Cloud
 * @PackageName com.dhcc.controller
 * @Title SysResourceController
 * @Date 2025/01/07 10:00
 * @Author LiuGuoting
 */
@RestController
@RequestMapping("/sys/resource")
public class SysResourceController {

    /**
     * 资源管理服务接口
     */
    @Resource
    private SysResourceService sysResourceService;
    @Autowired
    private SysDeptPositionResourceService sysDeptPositionResourceService;

    /**
     * 分页列表查询
     *
     * @param sysResource 资源信息对象实体
     * @param query 查询参数
     * @return 分页查询结果
     */
    @GetMapping("/page")
    public R<IPage<SysResourceListTree>> page(SysResource sysResource, Query query) {
        IPage<SysResourceListTree> pages = sysResourceService.selectResourcePage(Condition.getPage(query), sysResource);
        return R.data(pages);
    }

    /**
     * 列表查询
     *
     * @return 资源树形结构
     */
    @GetMapping("/listTree")
    public R<List<SysResourceListTree>> listTree() {
        return R.data(sysResourceService.listResourceTree());
    }

    /**
     * 新增资源
     *
     * @param sysResource 资源信息实体对象
     * @return 操作结果
     */
    @PostMapping("/add")
    public R<Boolean> add(@RequestBody SysResource sysResource) {
        return R.status(sysResourceService.addResource(sysResource), "新增资源成功");
    }

    /**
     * 查询资源详情
     *
     * @param resourceId 资源ID
     * @return 资源详情
     */
    @GetMapping("/detail")
    public R<SysResource> detail(@RequestParam("resourceId") String resourceId) {
        return R.data(sysResourceService.getResourceById(resourceId));
    }

    /**
     * 修改资源信息
     *
     * @param sysResource 资源信息实体对象
     * @return 操作结果
     */
    @PostMapping("/update")
    public R<Boolean> update(@RequestBody SysResource sysResource) {
        return R.status(sysResourceService.updateResource(sysResource), "修改资源失败！");
    }

    /**
     * 删除资源
     *
     * @param params 资源参数集合
     * @return 操作结果
     */
    @PostMapping("/delete")
    public R<Boolean> delete(@RequestBody Map<String, String> params) {
        // 从Map中获取id值，并转换为Long类型
        String id = params.get("id");
        boolean hasUndeletedChildResources = hasUndeletedChildResources(id);
        if (hasUndeletedChildResources) {
            return R.fail("该资源下有子资源，请先删除子资源！");
        }
        boolean allocationResources = isAllocationResources(id);
        if (allocationResources) {
            return R.fail("该资源已被分配到岗位，请先解除关联！");
        }
        return R.status(sysResourceService.deleteByIdLogic(id), "删除资源失败！");
    }

    /**
     * 批量删除资源
     *
     * @param ids 资源ID列表
     * @return 操作结果
     */
    @PostMapping("/deleteBatch")
    public R<Boolean> deleteBatch(@RequestBody List<String> ids) {
        for (String id : ids) {
            boolean hasUndeletedChildResources = hasUndeletedChildResources(id);
            if (hasUndeletedChildResources) {
                return R.fail("资源ID为" + id + "的资源下有子资源，请先删除子资源！");
            }
        }
        return R.status(sysResourceService.deleteBatchByIdsLogic(ids), "批量删除资源失败！");
    }

    /**
     * 修改资源状态
     *
     * @param sysResource 资源信息实体对象
     * @return 操作结果
     */
    @PostMapping("/updateStatus")
    public R<Boolean> updateStatus(@RequestBody SysResource sysResource) {
        return R.status(sysResourceService.changeResourceStatus(sysResource.getId(), sysResource.getStatus()), "更改资源状态失败！");
    }

    /**
     * 批量修改资源状态
     *
     * @param ids 资源ID列表
     * @param newStatus 新状态
     * @return 操作结果
     */
    @PostMapping("/updateStatusBatch")
    public R<Boolean> updateStatusBatch(@RequestBody List<String> ids, int newStatus) {
        return R.status(sysResourceService.changeResourceStatuses(ids, newStatus), "批量更改资源状态失败！");
    }

    /**
     * 判断是否存在未删除的子资源
     *
     * @param resourceId 传入资源ID
     * @return Boolean 是否有未删除的子资源
     */
    public boolean hasUndeletedChildResources(String resourceId) {
        // 创建一个LambdaQueryWrapper对象，用于构建查询条件
        LambdaQueryWrapper<SysResource> queryWrapper = new LambdaQueryWrapper<>();

        // 添加查询条件：资源父ID等于传入的资源ID
        queryWrapper.eq(SysResource::getResourceParentId, resourceId);

        // 添加查询条件：删除标志等于0，表示未删除
        queryWrapper.eq(SysResource::getDelFlag, 0);

        // 执行查询，获取未删除的子资源列表
        List<SysResource> sysResourceList = sysResourceService.list(queryWrapper);
        // 判断未删除的子资源列表是否为空
        // false，表示没有未删除的子资源。
        // true，表示存在未删除的子资源。
        return !sysResourceList.isEmpty();
    }

    /**
     * @param resourceId 传入资源ID
     * @return Boolean 该资源是否被分配到岗位
     */
    public boolean isAllocationResources(String resourceId) {
        // 创建一个LambdaQueryWrapper对象，用于构建查询条件
        LambdaQueryWrapper<SysDeptPositionResource> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        // 添加查询条件：资源ID等于传入的资源ID
        lambdaQueryWrapper.eq(SysDeptPositionResource::getResourceId, resourceId);
        // 执行查询，获取资源被分配到的岗位列表
        List<SysDeptPositionResource> sysDeptPositionResourceList = sysDeptPositionResourceService.list(lambdaQueryWrapper);
        // 判断岗位列表是否为空
        // false，表示没有岗位分配该资源，即该资源未被分配到任何岗位。
        // true，表示存在岗位分配了该资源，即该资源已被分配到某个岗位。
        return !sysDeptPositionResourceList.isEmpty();
    }

}
